@file:OptIn(ExperimentalForeignApi::class)

package com.jetbrains.kmpapp

import cocoapods.BDASignalSDK.BDASignalManager
import com.jetbrains.kmpapp.di.Koin
import com.jetbrains.kmpapp.utils.KVault
import kotlinx.cinterop.ExperimentalForeignApi
import platform.AdSupport.ASIdentifierManager
import platform.Foundation.NSDictionary
import platform.Foundation.NSUUID.Companion.UUID
import platform.UIKit.UIDevice

class Initializer(private val launchOptions: NSDictionary?) {

    companion object {
        private const val KEYCHAIN_IDFV_KEY = "deviceIdentifier" // 存储 IDFV/备用 ID 的键

        private val keychain = KVault(
            serviceName = "com.yourcompany.app.idfvService",
            accessibility = KVault.Accessible.AfterFirstUnlock
        )
    }

    fun initialize() {
        Koin.start()


    }

    // 初始化巨量
    private fun initBDASignalSDK() {
        BDASignalManager.registerWithOptionalData(null)
        BDASignalManager.didFinishLaunchingWithOptions(launchOptions = launchOptions?.toMap(), connectOptions = null)
    }

    // 初始化引力
    private fun initGravitySDK() {

    }

    // 初始化Appsflyer
    private fun initAppsflyerSDK() {

    }

    /**
     * 获取设备标识符 (IDFV)。
     * IDFV (Identifier For Vendor) 是一个特定于供应商的设备标识符。
     * 它是同一供应商（通过 Bundle ID 的前缀判断）在同一设备上安装的所有应用共享的。
     * 如果用户从设备上卸载了此供应商的所有应用，然后重新安装，则此值可能会更改。
     * Requires @OptIn(ExperimentalForeignApi::class) due to interop with Objective-C property access.
     */
    @OptIn(ExperimentalForeignApi::class)
    private fun getDeviceIdentifier(): String {
        // 1. 尝试从钥匙串中获取已存储的设备 ID (IDFV 或备用 UUID)
        var storedId = keychain.string(KEYCHAIN_IDFV_KEY)
        if (storedId == null) {
            // 2. 如果钥匙串中没有，尝试获取真实的 IDFV
            val currentIdfv = UIDevice.currentDevice.identifierForVendor?.UUIDString
            storedId = if (currentIdfv != null && currentIdfv.isNotBlank()) {
                // 3. 如果成功获取到 IDFV，就用它
                currentIdfv
            } else {
                // 4. 如果 IDFV 获取不到或为空，则随机生成一个新的 UUID 作为备用标识符
                UUID().UUIDString // 生成随机 UUID
            }

            // 5. 将获取到或生成的新 ID 存储到钥匙串中
            keychain.set(KEYCHAIN_IDFV_KEY, storedId) // 使用 KVault 的 set 方法
        }
        return storedId
    }

    /**
     * 获取广告标识符 (IDFA)。
     * IDFA (Identifier For Advertisers) 是用于广告追踪的唯一标识符。
     * 从 iOS 14.5 开始，获取 IDFA 需要用户通过 ATT (App Tracking Transparency) 框架明确授权。
     * 如果用户未授权，或者在隐私设置中限制了广告追踪，此函数将返回一个全零的字符串。
     * Requires @OptIn(ExperimentalForeignApi::class) due to interop with Objective-C property access.
     */
    @OptIn(ExperimentalForeignApi::class)
    private fun getAdsIdentifier(): String {
        // 检查广告追踪是否被启用。这是在用户授权后的检查。
        return if (ASIdentifierManager.sharedManager().isAdvertisingTrackingEnabled()) {
            // 如果启用，获取并返回 IDFA
            ASIdentifierManager.sharedManager().advertisingIdentifier().UUIDString
        } else {
            // 如果用户限制了广告追踪，通常返回全零的 IDFA
            "00000000-0000-0000-0000-000000000000"
        }
    }

    private fun NSDictionary?.toMap(): Map<Any?, Any?>? {
        if (this == null) return null

        val mutableMap = mutableMapOf<Any?, Any?>()
        val keyEnumerator = this.keyEnumerator() // 获取键的枚举器

        var key = keyEnumerator.nextObject() // 获取下一个键
        while (key != null) {
            val value = this.objectForKey(key) // 根据键获取值
            mutableMap[key] = value
            key = keyEnumerator.nextObject() // 继续下一个键
        }
        return mutableMap.toMap() // 转换为不可变 Map
    }

}